home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 August: Tool Chest / Dev.CD Aug 98 TC.toast / Sample Code / Interapplication Communication / MenuScripter 4.0 / Sources / MSAEDelete.c < prev    next >
Encoding:
Text File  |  1996-07-09  |  3.6 KB  |  156 lines  |  [TEXT/CWIE]

  1. // MSAEDelete.c
  2. //
  3. // Original version by Jon Lansdell and Nigel Humphreys.
  4. // 4.0 and 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1996, all rights reserved.
  6.  
  7. #include "MSAEDelete.h"
  8.  
  9. #include "MSAEUtils.h"
  10. #include "MSWindow.h"        // for DPtrFromWindowPtr()
  11. #include "MSAESelect.h"
  12.  
  13.  
  14. #pragma segment AppleEvent
  15.  
  16.  
  17.  
  18. // -----------------------------------------------------------------------
  19. //        Name:         DoDelete
  20. //        Purpose:    Performs a delete text operation on the direct object,
  21. //                    if there is no direct object then delete the current
  22. //                    selection
  23. // -----------------------------------------------------------------------
  24.      
  25. pascal OSErr    DoDelete(const AppleEvent *theAppleEvent, AppleEvent *reply, long refcon)
  26. {
  27. #ifdef __MWERKS__
  28.     #pragma unused (reply, refcon)
  29. #endif
  30.  
  31.     AEDesc        directObj = {typeNull, NULL};
  32.     TextToken    aTextToken;
  33.     short        ignore;
  34.     OSErr        err;
  35.  
  36.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  37.     if (noErr != err) goto done;
  38.     
  39.     if (directObj.descriptorType != typeNull)
  40.         err = DeleteDesc(&directObj);
  41.     else
  42.     {            // Just delete the selection of the front window
  43.         err = GetWindowSelection(FrontWindow(), &aTextToken, &ignore);
  44.         if (noErr != err) goto done;
  45.         
  46.         err = DeleteTextToken(&aTextToken);
  47.     }
  48.  
  49. done:    
  50.     (void)AEDisposeDesc(&directObj);
  51.         
  52.     return(err);
  53. } // DoDeleteEdit
  54.  
  55.  
  56. OSErr    DeleteTextToken(TextToken* theToken)
  57. {
  58.     WindowPtr        aWindow;
  59.     DPtr            docPtr;
  60.     TextToken        oldSelection;
  61.     short            oldLength,
  62.                     insertLength;                // Should be zero
  63.     OSErr            err;
  64.     
  65.     if (! theToken->tokenLength)        // Pointless deleting nothing
  66.         return(noErr);
  67.         
  68.     aWindow = theToken->tokenWindow;
  69.     docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
  70.     
  71.     if (! aWindow || ! docPtr)
  72.         return(errAENoSuchObject);
  73.     
  74.     err = GetWindowSelection(aWindow, &oldSelection, &oldLength);
  75.     if (noErr != err) goto done;
  76.  
  77.     err = SelectTextToken(theToken);
  78.     if (noErr != err) goto done;
  79.  
  80.     TEDelete(docPtr->theText);     
  81.             
  82.     docPtr->dirty = true;
  83.     AdjustScrollbars(docPtr, false);
  84.     DrawPageExtras(docPtr);
  85.     
  86.     err = UpdateSelectionToken(theToken, &oldSelection, oldLength, &insertLength);
  87.     
  88. done:
  89.     return(err);
  90. }
  91.  
  92. OSErr    DeleteTextDesc(AEDesc* textDesc)
  93. {
  94.     TextToken        aTextToken;
  95.     Size            actualSize;
  96.     OSErr            err;
  97.  
  98.     if (typeMyText != textDesc->descriptorType)
  99.         return(errAETypeError);
  100.         
  101.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  102.  
  103.     err = DeleteTextToken(&aTextToken);
  104.     
  105.     return(err);
  106. }
  107.  
  108. OSErr    DeleteDesc(AEDesc* aDesc)
  109. {
  110.     AEDesc        deleteDesc = {typeNull, NULL},
  111.                 textDesc = {typeNull, NULL},
  112.                 itemDesc = {typeNull, NULL};
  113.     long        index;
  114.     DescType    theAEKeyword;
  115.     OSErr        err;
  116.     
  117.     if (typeObjectSpecifier == aDesc->descriptorType)
  118.         err = AEResolve(aDesc, kAEIDoMinimum, &deleteDesc);
  119.     else if (typeNull != aDesc->descriptorType)
  120.         err = AEDuplicateDesc(aDesc, &deleteDesc);
  121.         
  122.     if (noErr != err) goto done;
  123.     
  124.     switch (deleteDesc.descriptorType)
  125.     {
  126.         case typeAEList:
  127.             err = AECountItems(&deleteDesc, &index);
  128.             if (noErr != err) goto done;
  129.             
  130.             for (; index > 0; index--)            // Do backwards or offsets will screw up.
  131.             {                                    // Perhaps we should sort this list first.
  132.                                                 // Can a query double up on offsets?
  133.                 err = AEGetNthDesc(&deleteDesc, index, typeWildCard, &theAEKeyword, &itemDesc);
  134.                 if (noErr != err) goto done;
  135.                 
  136.                 err = DeleteDesc(&itemDesc);    // Call recursively
  137.                 if (noErr != err) goto done;
  138.  
  139.                 (void)AEDisposeDesc(&itemDesc);
  140.             }
  141.             break;
  142.             
  143.         default:
  144.             err = AECoerceDesc(&deleteDesc, typeMyText, &textDesc);
  145.             if (noErr != err) goto done;
  146.             err = DeleteTextDesc(&textDesc);
  147.     }
  148.     
  149. done:
  150.     (void)AEDisposeDesc(&deleteDesc);
  151.     (void)AEDisposeDesc(&textDesc);
  152.     (void)AEDisposeDesc(&itemDesc);
  153.     
  154.     return(err);
  155. }
  156.